package jmine.tec.di.scope;

import java.util.Map;

/**
 * Interface que representa um conjunto tipado de objetos.
 */
public interface TypedScope extends Scoped<TypedScope> {
    /**
     * @return as propriedades por tras deste escopo
     */
    Map<String, Object> getProperties();

    /**
     * Devolve o objeto associado à chave passada e do tipo passado.
     * 
     * @param <T> o tipo
     * @param key chave
     * @param clazz tipo
     * @return T
     */
    <T> T get(String key, Class<T> clazz);

    /**
     * Adiciona um objeto a este escopo
     * 
     * @param key chave associada
     * @param value valor associado
     */
    void put(String key, Object value);

    /**
     * Adiciona uma referencia a este escopo - referencia para outro objeto no mesmo escopo.
     * 
     * @param key a chave associada
     * @param value o valor
     */
    void putDefinition(String key, Object value);

    /**
     * Verifica se este escopo ou escopos maiores possuem um objeto associado à chave passada
     * 
     * @param key chave
     * @return boolean
     */
    boolean containsKey(String key);

    /**
     * @return o escopo pai
     */
    TypedScope getParent();
}
